package br.com.JZSolution.domineduplex.gui.paineltransferencia;

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JProgressBar;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;

import br.com.JZSolution.domineduplex.gui.images.LeitorDeImagem;
import br.com.JZSolution.domineduplex.modelo.Transferencia;
import br.com.JZSolution.domineduplex.swing.JProgressBarJZ;

public class TransferTable extends JTable {

	private static final long serialVersionUID = 1L;
	private int largura;
	private int rowSelectedWithToolTip; 
	
	public static final ImageIcon IMG_UP = LeitorDeImagem.getInstance().carregarImagem("up.png");
	public static final ImageIcon IMG_DOWN = LeitorDeImagem.getInstance().carregarImagem("down.png");
	public static final ImageIcon IMG_AGUARDANDO = LeitorDeImagem.getInstance().carregarImagem("contato.png");
	public static final ImageIcon IMG_PAUSADA = LeitorDeImagem.getInstance().carregarImagem("pasta.png");
	public static final ImageIcon IMG_PARADA = LeitorDeImagem.getInstance().carregarImagem("remover.png");
	public static final ImageIcon IMG_CANCELADA = LeitorDeImagem.getInstance().carregarImagem("send.png");
	public static final ImageIcon IMG_CONCLUIDA_SUCESSO = LeitorDeImagem.getInstance().carregarImagem("Conectado.png");
	public static final ImageIcon IMG_CONCLUIDA_FALHA = LeitorDeImagem.getInstance().carregarImagem("Desconectado.png");
	
	
	public TransferTable(){
		super(new ModeloDaTabela());
		this.setAutoResizeMode(AUTO_RESIZE_LAST_COLUMN);
		this.setDefaultRenderer(JProgressBar.class, new RenderizadorDeProgress());
		this.setDefaultRenderer(JProgressBarJZ.class, new RenderizadorDeProgress());
		this.setDefaultRenderer(JLabel.class, new RenderizadorDeLabel());
		this.largura = ajustarColunas();
		this.setRowHeight(20);
		AtualizadoDaInterface refresher = new AtualizadoDaInterface(this);
		refresher.start();
		
		this.addMouseListener(new MouseListener(){
			public void mouseClicked(MouseEvent e) {}
			public void mouseEntered(MouseEvent e) {}
			public void mouseExited(MouseEvent e) {}
			public void mousePressed(MouseEvent e) {
				showPopup(e);
			}
			public void mouseReleased(MouseEvent e) {
				showPopup(e);
			}
			private void showPopup(MouseEvent e) {
				if (e.isPopupTrigger()) {
					criarPopUp(e);
				}
			}
		});
		final JTable table = this;
		this.addMouseMotionListener(new MouseMotionListener(){
			public void mouseDragged(MouseEvent e) {}

			@Override
			public void mouseMoved(MouseEvent e) {
				if(rowSelectedWithToolTip != -1){  
					FileProgress prog = ((Transferencia)((ModeloDaTabela) (   (TransferTable)  table).getModel()).getLista().get(rowSelectedWithToolTip)).getFileProgress();
					prog.getComponenteVisual().setShowToolTip(false);
					rowSelectedWithToolTip = -1;
				}
			}
			
		});
	}
	
	private void criarPopUp(MouseEvent e) {
		JPopupMenu menu = new JPopupMenu();
		JMenuItem apagarConcluidos = new JMenuItem("Remover transferências concluídas");
		apagarConcluidos.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				((ModeloDaTabela)getModel()).apagarConcluidos();
			}
		});
		menu.add(apagarConcluidos);
		//TODO implementar essas funcionalidades abaixo
		JMenuItem pararTransferencia = new JMenuItem("Parar transferência");
		//menu.add(pararTransferencia);
		JMenuItem pausarTransferencia = new JMenuItem("Pausar transferência");
		menu.add(pausarTransferencia);
		JMenuItem reiniciarTransferencia = new JMenuItem("Reiniciar transferência");
		menu.add(reiniciarTransferencia);
		JMenuItem pararTodasTransferencia = new JMenuItem("Parar todas as transferências");
		//menu.add(pararTodasTransferencia);
		JMenuItem reiniciarTodasTransferencia = new JMenuItem("Reiniciar todas as transferências");
		//menu.add(reiniciarTodasTransferencia);
		
		menu.show(e.getComponent(), e.getX(), e.getY());
	}
	
	public String getToolTipText(MouseEvent e) {
        String tip = null;
        java.awt.Point p = e.getPoint();
        int rowIndex = rowAtPoint(p);
        int colIndex = columnAtPoint(p);
        int realColumnIndex = convertColumnIndexToModel(colIndex);

        if (realColumnIndex == 2) { 
            FileProgress prog = ((Transferencia)((ModeloDaTabela) (   (TransferTable)  this).getModel()).getLista().get(rowIndex)).getFileProgress();
            rowSelectedWithToolTip = rowIndex;
            prog.getComponenteVisual().setShowToolTip(true);
            return tip;  
        } else if (realColumnIndex == 1){
        	  TableModel model = getModel();
              tip = (String)model.getValueAt(rowIndex,1);
        }
        return tip;
    }
	
	
	@Override
	public ModeloDaTabela getModel() {
		return (ModeloDaTabela)super.getModel();
	}
	private int ajustarColunas(){
		  ModeloDaTabela mdt = (ModeloDaTabela)this.getModel();
		  TableColumn column = null;
		  int largura=0;
		  int width=0;
		  for(int i = 0; i < mdt.getColumnCount(); i++){
			  column = this.getColumnModel().getColumn(i);
			  switch (i){
			  	case 0: width = 50; break;
			  	case 1: width = 240; break;
			  	case 2: width = 200; break;
			  	case 3: width = 60; break;
			  	case 4: width = 72; break;
			  	case 5: width = 90; break;
			  }
			  column.setPreferredWidth(width);
			  largura+=width;
		  }
		  return largura;
	}

	public int getLargura() {
		return largura;
	}
}

class AtualizadoDaInterface extends Thread{
	TransferTable table;
	
	public AtualizadoDaInterface(TransferTable table) {
		this.table = table;
	}
	
	@Override
	public void run() {
		try{
			List<Transferencia> lista = table.getModel().getLista();
			while(true){
				Thread.sleep(1000);
				if(lista.size() != 0){
					table.repaint();
				}
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}

class RenderizadorDeProgress implements TableCellRenderer {
	
	public RenderizadorDeProgress() {
	}
	
	public Component getTableCellRendererComponent(JTable table, Object color,
			boolean isSelected, boolean hasFocus, int row, int column) {
		FileProgress prog = ((Transferencia)((ModeloDaTabela) (   (TransferTable)  table).getModel()).getLista().get(row)).getFileProgress();
		
		if(row % 2 ==0){
			prog.setBackground(new Color(242,242,242));
		}else{
			prog.setBackground(new Color(255,255,255));
		}
		if(isSelected){
			prog.setBackground(new Color(57,105,138));
		}
		
		return prog;
		
	}
}
class RenderizadorDeLabel implements TableCellRenderer {
	
	public Component getTableCellRendererComponent(JTable table, Object color,
			boolean isSelected, boolean hasFocus, int row, int column) {
		
		JLabel label = (JLabel)color;
		if(column == 0){
			 Transferencia transf = ((Transferencia)((ModeloDaTabela) (   (TransferTable)  table).getModel()).getLista().get(row));
			 int estado = transf.getEstado();
			 if(estado ==  Transferencia.ATIVA){
				if(transf.getTipo() == Transferencia.DOWN){
					label.setIcon(TransferTable.IMG_DOWN);
				}else {
					label.setIcon(TransferTable.IMG_UP);
				}
			}else if(estado ==  Transferencia.AGUARDANDO){
				label.setIcon(TransferTable.IMG_AGUARDANDO);
			}else if(estado ==  Transferencia.PAUSADA){
				label.setIcon(TransferTable.IMG_PAUSADA);
			}else if(estado ==  Transferencia.PARADA){
				label.setIcon(TransferTable.IMG_PARADA);
			}else if(estado ==  Transferencia.CANCELADA){
				label.setIcon(TransferTable.IMG_CANCELADA);
			}else if(estado ==  Transferencia.CONCLUIDA_SUCESSO){
				label.setIcon(TransferTable.IMG_CONCLUIDA_SUCESSO);
			}else if(estado ==  Transferencia.CONCLUIDA_FALHA){
				label.setIcon(TransferTable.IMG_CONCLUIDA_FALHA);
			}
		}else if(column == 3){
			label = ((Transferencia)((ModeloDaTabela) (   (TransferTable)  table).getModel()).getLista().get(row)).getFileProgress().getLabelConcluido();
		}else if (column == 5){
			label = ((Transferencia)((ModeloDaTabela) (   (TransferTable)  table).getModel()).getLista().get(row)).getLabelVel();
		}
		
		
		if(row % 2 ==0){
			label.setOpaque(true);
			label.setBackground(new Color(242,242,242));
		}else{
			label.setOpaque(true);
			label.setBackground(new Color(255,255,255));
		}
		if(isSelected){
			label.setOpaque(true);
			label.setBackground(new Color(57,105,138));
			label.setForeground(Color.WHITE);
		}else{
			label.setForeground(Color.BLACK);
		}
		
		return label;
	}
}
